package com.ftg.learn.chapter09.reflech.demo01;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author kangjx
 * @date 2023/1/12
 */
public class DemoMethod {

    public static void main(String[] args) {
        //第一种实现反射的方式
        String path = "com.ftg.learn.chapter09.reflech.demo01.Human";
        try {
            Class c1 = Class.forName(path);

            //通过关联对象查找真实对象当中的所有方法

            //我可以通过类查找所有字段以及方法

            //但是我们要执行对应的方法，实例
            Object obj = c1.newInstance();

            //getMethods 自己和父类的所有公共方法
            Method[] ms = c1.getMethods();
            for (int i = 0; i < ms.length; i++) {
                System.out.print(ms[i].getName()+"方法名称\t");
            }
            System.out.println(" 这是我自己里面的全部方法");
            Method[] ms1 = c1.getDeclaredMethods();
            for (int i = 0; i < ms1.length; i++) {
                System.out.print(ms1[i].getName()+"方法名称\t");
                System.out.println("我要执行" +  ms1[i].getName() +"方法了，请看方法的执行");

                Method tempMethod = ms1[i];
                //执行方法
                //要在指定的对象，指定的参数上面执行这个方法
                Object val = tempMethod.invoke(obj);
                System.out.println(val+"结果");
            }


            //讲解  方法动态参数 [动态声明参数个数]

//            获得一个方法
//            Method s  = c1.getMethod("say");
//            Method s1  = c1.getMethod("say",int.class);
//            Method s2  = c1.getMethod("say",int.class,int.class);
//            Method s3  = c1.getMethod("say",int.class,String.class);


            //反射就是让使用者看不到，或者隐藏类的创建逻辑，调用方式

        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }

}
